<html>
    <head>
    <link rel="stylesheet" href="lmm.css" type="text/css" />
    </head>
<body class="lmm">
<!-- This file is part of the Lisp Machine manual.  -*-Text-*- -->
<!-- Mention the term job system early on in this chapter. -->
<!-- Description of stuff in JOBSYS. -->
<div class='chapter' id='30'>30. TVOBs and Jobs</div>
[The subject of this chapter is currently being redesigned.  The contents
of this chapter will be completely changed in the next edition of this manual.]

<div class='section' id='30.1'>30.1 Introduction to the Concepts of This Chapter</div>
<p class='cindent'><!-- tvob -->
	<!-- open: 1, close: 0 --><font class="italic">TVOBs</font><!-- open: 1, close: 1 --> <!-- MATCHED MATCHED MATCHED --> (TV OBjects) represent permission to use
the TV screen.  The TVOB mechanism is provided to allow the
TV to be shared between all of the activities the user
may be conducting, without those activities getting in each other's
way.

<p class='cindent' id='tvob'><!-- job -->
	A <!-- open: 2, close: 1 --><font class="italic">job</font><!-- open: 2, close: 2 --> <!-- MATCHED MATCHED MATCHED --> is a collection of processes and TVOBs,ed
together for the user's convenience.  The processes can be started
and stopped together, and the TVOBs can be put on or taken off the
TV together.

<div class='section' id='30.2'>30.2 Introduction to the Concepts of This Chapter</div>	A <!-- open: 3, close: 2 --><font class="italic">TVOB</font><!-- open: 3, close: 3 --> <!-- MATCHED MATCHED MATCHED --> (TV OBject) is a Lisp structure with the following
components:
<table><!-- ftable -->
 3
<tr valign='top'>
<td><font class='lisp'> tvob-name</font></td><td>This is the name of the TVOB, as a string.  It is only used for
the TVOB's printed representation, and can be anything reasonably
mnemonic.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-x1</font></td><td>The first (leftmost) column of the TVOB's area of the screen.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-y1</font></td><td>The first (highest) line of the TVOB's area of the screen.
The <!-- open: 4, close: 3 --><font class="lisp">tvob-x1</font><!-- open: 4, close: 4 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 5, close: 4 --><font class="lisp">tvob-y1</font><!-- open: 5, close: 5 --> <!-- MATCHED MATCHED MATCHED --> are the co-ordinates of the
upper-left-hand corner of the TVOB's rectangular area.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-x2</font></td><td>The first (leftmost) column to the right of the TVOB's area of the screen.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-y2</font></td><td>The first (highest) line below the TVOB's area of the screen.
The <!-- open: 6, close: 5 --><font class="lisp">tvob-x2</font><!-- open: 6, close: 6 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 7, close: 6 --><font class="lisp">tvob-y2</font><!-- open: 7, close: 7 --> <!-- MATCHED MATCHED MATCHED --> are the co-ordinates of the
lower-right-hand corner of the TVOB's rectangular area, with 1 added to each.
Thus the height of the tvob is the difference between its <!-- open: 8, close: 7 --><font class="lisp">tvob-y2</font><!-- open: 8, close: 8 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 9, close: 8 --><font class="lisp">tvob-y1</font><!-- open: 9, close: 9 --> <!-- MATCHED MATCHED MATCHED -->,
and the width is the difference between the <!-- open: 10, close: 9 --><font class="lisp">tvob-x2</font><!-- open: 10, close: 10 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 11, close: 10 --><font class="lisp">tvob-x1</font><!-- open: 11, close: 11 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-handler</font></td><td>A function, described below.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-info</font></td><td>This field may contain anything at all; it is meant to be used by the
<!-- open: 12, close: 11 --><font class="lisp">tvob-handler</font><!-- open: 12, close: 12 --> <!-- MATCHED MATCHED MATCHED --> function.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-job</font></td><td>The job associated with this TVOB, or <!-- open: 13, close: 12 --><font class="lisp">nil</font><!-- open: 13, close: 13 --> <!-- MATCHED MATCHED MATCHED --> if there is no associated
job.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-priority</font></td><td>Either <!-- open: 14, close: 13 --><font class="lisp">t</font><!-- open: 14, close: 14 --> <!-- MATCHED MATCHED MATCHED --> or <!-- open: 15, close: 14 --><font class="lisp">nil</font><!-- open: 15, close: 15 --> <!-- MATCHED MATCHED MATCHED -->.  If it is <!-- open: 16, close: 15 --><font class="lisp">t</font><!-- open: 16, close: 16 --> <!-- MATCHED MATCHED MATCHED -->, the functions which
allocate area on the screen (<!-- open: 17, close: 16 --><font class="lisp">tvob-create</font><!-- open: 17, close: 17 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 18, close: 17 --><font class="lisp">tvob-create-expandable</font><!-- open: 18, close: 18 --> <!-- MATCHED MATCHED MATCHED -->,
see <font color='red'>LINK:(</font>tvob-create-fun))
will be reluctant to allocate over this TVOB's area of the screen.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-screen</font></td><td>The screen on which this TVOB is displayed.  See <a href='tv.html#screen'>this link</a>.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-status</font></td><td>This field is provided for the convenience of <!-- open: 19, close: 18 --><font class="lisp">tvob-handler</font><!-- open: 19, close: 19 --> <!-- MATCHED MATCHED MATCHED --> functions.
It contains one of the following symbols:
<table>
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :selected</font></td><td>The TVOB is the selected TVOB.  Only one TVOB will have this <!-- open: 20, close: 19 --><font class="lisp">tvob-status</font><!-- open: 20, close: 20 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :exposed</font></td><td>The TVOB is not selected, but is on <!-- open: 21, close: 20 --><font class="lisp">exposed-tvobs</font><!-- open: 21, close: 21 --> <!-- MATCHED MATCHED MATCHED -->.  This means that this
TVOB is not covered by any other TVOB; its screen area is fully exposed.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> nil</font></td><td>The TVOB is not on <!-- open: 22, close: 21 --><font class="lisp">exposed-tvobs</font><!-- open: 22, close: 22 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr><!-- item_ --></table><!-- end table -->

<tr valign='top'><td colspan='2'><font class='lisp'> tvob-clobbered-p</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>This field is provided for the convenience of <!-- open: 23, close: 22 --><font class="lisp">tvob-handler</font><!-- open: 23, close: 23 --> <!-- MATCHED MATCHED MATCHED --> functions.
It is <!-- open: 24, close: 23 --><font class="lisp">t</font><!-- open: 24, close: 24 --> <!-- MATCHED MATCHED MATCHED --> if the TVOB has been sent a <!-- open: 25, close: 24 --><font class="lisp">:clobber</font><!-- open: 25, close: 25 --> <!-- MATCHED MATCHED MATCHED --> or <!-- open: 26, close: 25 --><font class="lisp">:set-edges</font><!-- open: 26, close: 26 --> <!-- MATCHED MATCHED MATCHED -->
command more recently
than an <!-- open: 27, close: 26 --><font class="lisp">:update</font><!-- open: 27, close: 27 --> <!-- MATCHED MATCHED MATCHED --> command; otherwise it is <!-- open: 28, close: 27 --><font class="lisp">nil</font><!-- open: 28, close: 28 --> <!-- MATCHED MATCHED MATCHED -->.
<tr valign='top'><td colspan='2'><font class='lisp'> tvob-mouse-handler</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>A function to call when the mouse enters this TVOB's screen region.  This allows
the TVOB to take over control of the mouse.  This field is <!-- open: 29, close: 28 --><font class="lisp">nil</font><!-- open: 29, close: 29 --> <!-- MATCHED MATCHED MATCHED --> if this TVOB
does not do anything special with the mouse.
<tr valign='top'><td colspan='2'><font class='lisp'> tvob-mouse-action</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>See <!-- open: 30, close: 29 --><font class="lisp">mouse-default-handler</font><!-- open: 30, close: 30 --> <!-- MATCHED MATCHED MATCHED --> (<font color='red'>LINK:(</font>mouse-default-handler-fun)).
<tr valign='top'>
<td><font class='lisp'> tvob-plist</font></td><td>A disembodied property list.  Use, for example, <!-- open: 31, close: 30 --><font class="lisp">(get (locf (tvob-plist tvob)) 'mumble)</font><!-- open: 31, close: 31 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr><!-- item_ --></table><!-- end table -->


	It is often useful to divide the TV screen up into several parts,
and do different things in each part.  Sometimes one program wants
to split up the screen, as Eine does; sometimes the user wants to run several
programs at once, and each program wants some space on the screen.
At any time, there is a set of <!-- open: 32, close: 31 --><font class="italic">active TVOBs</font><!-- open: 32, close: 32 --> <!-- MATCHED MATCHED MATCHED --> (TV objects) which are sharing
the screen.  Each TVOB has a rectangular piece of the screen on which
it does its displaying; it is not allowed to go outside its area.

	It is possible for two active TVOB's regions of the screen
to overlap.  When this happens, only one of them is <!-- open: 33, close: 32 --><font class="italic">exposed</font><!-- open: 33, close: 33 --> <!-- MATCHED MATCHED MATCHED --> (fully
visible); the other is partially or fully buried.  There is a subset of
the active TVOBs called the <!-- open: 34, close: 33 --><font class="italic">exposed</font><!-- open: 34, close: 34 --> <!-- MATCHED MATCHED MATCHED --> TVOBs; no two exposed TVOBs
overlap.  The TVOBs act as if they were a bunch of rectangular sheets
of paper on a desktop; some are up at the top, and others are partially
buried.  Various programs can "pull" a non-exposed TVOB up to the top,
making it exposed and making some other TVOB(s) non-exposed.  Several functions
of the job system, explained below, keep track of and change which TVOBs
are active, and which are exposed.

	The job system also keeps track of one TVOB called the
<!-- open: 35, close: 34 --><font class="italic">selected TVOB</font><!-- open: 35, close: 35 --> <!-- MATCHED MATCHED MATCHED -->.  Conceptually, the selected TVOB is the one in which
the user is interested at the moment, and it is usually the one that is
responding to the keyboard.  For example, when Eine is being used, the
TVOB of the window in which the user is editing is the selected TVOB.
The selected TVOB is always exposed.
A TVOB's being selected, exposed but not selected, or not exposed at
all is called the TVOB's <!-- open: 36, close: 35 --><font class="italic">status</font><!-- open: 36, close: 36 --> <!-- MATCHED MATCHED MATCHED -->.

	Usually a program will want certain actions to be taken when
the status of a TVOB changes.  When the TVOB associated with an Eine window
becomes exposed, Eine generally wants
to redisplay the window, and when the TVOB is selected, Eine starts
blinking the window's blinkers and makes its buffer be the current
buffer.  In order to let a user program know that the status of a
TVOB has changed, so that it can do these things, there is a function
called the <!-- open: 37, close: 36 --><font class="italic">handler</font><!-- open: 37, close: 37 --> <!-- MATCHED MATCHED MATCHED --> associated with every TVOB.  When the status of
the TVOB changes, its handler is applied to three arguments:  the TVOB
itself, a keyword symbol indicating what kind of change of status
is occurring, and a list of other information whose meaning is dependant
on the value of the second argument.  The applications of this function
can be thought of as a "command" being sent to the TVOB.  For example, when
a TVOB becomes selected, it is "sent a command" telling it so; that is,
the handler is applied to the TVOB, the keyword <!-- open: 38, close: 37 --><font class="lisp">:select</font><!-- open: 38, close: 38 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 39, close: 38 --><font class="lisp">nil</font><!-- open: 39, close: 39 --> <!-- MATCHED MATCHED MATCHED -->.

	Here is a list of all of the keyword symbols (i.e. all of the kinds
of commands) that are used.  In addition to status changes, requests
for the TVOB to update and relocate itself cause the handler to be
invoked.

<table>
<tr valign='top'>
<td><font class='lisp'> :expose</font></td><td>The TVOB is being made exposed.  This command is only sent
when the TVOB is active and not exposed.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :deexpose</font></td><td>The TVOB is no longer exposed.  This command is only sent when
the TVOB is active and exposed.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :select</font></td><td>The TVOB is now selected.  This command is only sent when the TVOB
is exposed and not selected.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :deselect</font></td><td>The TVOB is no longer selected.  This command is only sent when the TVOB
is selected.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :clobber</font></td><td>This command means that for some reason, the TVOB's area of the screen has
been altered; future <!-- open: 40, close: 39 --><font class="lisp">:update</font><!-- open: 40, close: 40 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 41, close: 40 --><font class="lisp">:clean</font><!-- open: 41, close: 41 --> <!-- MATCHED MATCHED MATCHED --> commands should not
assume that the screen is as it was left.  Most TVOBs will ignore this
message, since the information is saved in the <!-- open: 42, close: 41 --><font class="lisp">tvob-clobbered-p</font><!-- open: 42, close: 42 --> <!-- MATCHED MATCHED MATCHED -->
element of the TVOB (see below).  This command is only sent when the TVOB
is exposed.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :update</font></td><td>This command is only sent when the TVOB is exposed.
The TVOB should assure that its area of the screen contains whatever
it is supposed to contain.  Just what <!-- open: 43, close: 42 --><font class="lisp">:update</font><!-- open: 43, close: 43 --> <!-- MATCHED MATCHED MATCHED --> means depends on the
program.  Some programs can remember the contents of what is on the TVOB
and can refresh it at will; others do not remember the contents, and cannot
reconstruct them.

The former kind, upon receiving the <!-- open: 44, close: 43 --><font class="lisp">:update</font><!-- open: 44, close: 44 --> <!-- MATCHED MATCHED MATCHED --> command,
should update the TVOB.  If the TVOB has not been clobbered, the handler
can assume that whatever it last put there is still there, and it may
be able to avoid redisplaying.  The <!-- open: 45, close: 44 --><font class="lisp">tvob-clobbered-p</font><!-- open: 45, close: 45 --> <!-- MATCHED MATCHED MATCHED --> field
of the TVOB is set to <!-- open: 46, close: 45 --><font class="lisp">t</font><!-- open: 46, close: 46 --> <!-- MATCHED MATCHED MATCHED --> by the job system after a <!-- open: 47, close: 46 --><font class="lisp">:clobber</font><!-- open: 47, close: 47 --> <!-- MATCHED MATCHED MATCHED -->
or <!-- open: 48, close: 47 --><font class="lisp">:set-edges</font><!-- open: 48, close: 48 --> <!-- MATCHED MATCHED MATCHED -->
command is sent, and to <!-- open: 49, close: 48 --><font class="lisp">nil</font><!-- open: 49, close: 49 --> <!-- MATCHED MATCHED MATCHED --> after an <!-- open: 50, close: 49 --><font class="lisp">:update</font><!-- open: 50, close: 50 --> <!-- MATCHED MATCHED MATCHED --> or <!-- open: 51, close: 50 --><font class="lisp">:clean</font><!-- open: 51, close: 51 --> <!-- MATCHED MATCHED MATCHED -->
command is sent. The handler can determine whether or not its area
of the screen has been clobbered by simply looking at the <!-- open: 52, close: 51 --><font class="lisp">tvob-clobbered-p</font><!-- open: 52, close: 52 --> <!-- MATCHED MATCHED MATCHED -->.

The latter kind of TVOB cannot update,
and should ignore the <!-- open: 53, close: 52 --><font class="lisp">:update</font><!-- open: 53, close: 53 --> <!-- MATCHED MATCHED MATCHED --> command entirely.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :clean</font></td><td><!-- open: 54, close: 53 --><font class="lisp">:clean</font><!-- open: 54, close: 54 --> <!-- MATCHED MATCHED MATCHED --> is like <!-- open: 55, close: 54 --><font class="lisp">:update</font><!-- open: 55, close: 55 --> <!-- MATCHED MATCHED MATCHED --> except that TVOBs of the kind that
cannot refresh themselves should clear their areas instead of doing nothing.
Like <!-- open: 56, close: 55 --><font class="lisp">:update</font><!-- open: 56, close: 56 --> <!-- MATCHED MATCHED MATCHED -->, this command is only sent when the TVOB is exposed.
<!-- open: 57, close: 56 --><font class="lisp">:clean</font><!-- open: 57, close: 57 --> <!-- MATCHED MATCHED MATCHED --> is sent to all exposed TVOBs when the user requests that the screen be 
cleaned up; for instance when the FORM key is pressed in most programs.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :set-edges</font></td><td>The TVOB should change its area of the screen.  This command takes four
arguments: the new left edge, top edge, bottom edge, and right edge, in raster
units.  The first two are inclusive, and the other two are exclusive.
The elements of the TVOB structure that hold the screen area (<!-- open: 58, close: 57 --><font class="lisp">tvob-x1</font><!-- open: 58, close: 58 --> <!-- MATCHED MATCHED MATCHED --> etc.)
will be updated automatically; the handler need not change them itself.
The handler should update any other associated information; for example,
if the TVOB has an associated "piece of paper", it should call <!-- open: 59, close: 58 --><font class="lisp">tv-redefine-pc-ppr</font><!-- open: 59, close: 59 --> <!-- MATCHED MATCHED MATCHED -->
(see <font color='red'>LINK:(</font>tv-redefine-pc-ppr-fun)).
</td></tr><!-- item_ --></table><!-- end table -->


	The <!-- open: 60, close: 59 --><font class="lisp">tvob-info</font><!-- open: 60, close: 60 --> <!-- MATCHED MATCHED MATCHED --> component of the TVOB is provided to give
the handler somewhere to put its internal state.  It is usually
some kind of structure, depending on what program created the TVOB.
For example, it might be a piece of paper (see <a href='tv.html#pc-ppr'>this link</a>).

<div class='section' id='30.3'>30.3 Introduction to the Concepts of This Chapter</div>	A <!-- open: 61, close: 60 --><font class="italic">job</font><!-- open: 61, close: 61 --> <!-- MATCHED MATCHED MATCHED --> is a Lisp structure with the following components:
</table><!-- end ftable -->
<table><!-- ftable -->
 3
<tr valign='top'>
<td><font class='lisp'> job-name</font></td><td>The name of the job, as a string.  This is only used for the printed
representation of the job or for display by programs, and may be anything
reasonably mnemonic.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> job-tvobs</font></td><td>A list of all TVOBs associated with this job.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> job-processes</font></td><td>A list of all processes associated with this job.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-enabled-tvobs</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>A list of this job's enabled tvobs.  Each TVOB on this list is also
on the <!-- open: 62, close: 61 --><font class="lisp">job-tvobs</font><!-- open: 62, close: 62 --> <!-- MATCHED MATCHED MATCHED --> list.  The order of the enabled tvobs list is
"highest" first; this list is sometimes passed to <!-- open: 63, close: 62 --><font class="lisp">tvob-setup</font><!-- open: 63, close: 63 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-enabled-processes</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>A list of this job's enabled processes.  This list is a subset of
the <!-- open: 64, close: 63 --><font class="lisp">job-processes</font><!-- open: 64, close: 64 --> <!-- MATCHED MATCHED MATCHED --> list.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-tvob-enabled-p</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>If this is non-<!-- open: 65, close: 64 --><font class="lisp">nil</font><!-- open: 65, close: 65 --> <!-- MATCHED MATCHED MATCHED -->, this job is <!-- open: 66, close: 65 --><font class="italic">tvob-enabled</font><!-- open: 66, close: 66 --> <!-- MATCHED MATCHED MATCHED -->; its enabled
TVOBs are active.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-process-enabled-p</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>If this is non-<!-- open: 67, close: 66 --><font class="lisp">nil</font><!-- open: 67, close: 67 --> <!-- MATCHED MATCHED MATCHED -->, this job is <!-- open: 68, close: 67 --><font class="italic">process-enabled</font><!-- open: 68, close: 68 --> <!-- MATCHED MATCHED MATCHED -->; its enabled
processes are active.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-who-line-process</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>Whenever this job becomes the <!-- open: 69, close: 68 --><font class="lisp">kbd-job</font><!-- open: 69, close: 69 --> <!-- MATCHED MATCHED MATCHED -->, the process in this component
becomes the <!-- open: 70, close: 69 --><font class="lisp">tv-who-line-process</font><!-- open: 70, close: 70 --> <!-- MATCHED MATCHED MATCHED --> (The process whose <!-- open: 71, close: 70 --><font class="lisp">process-whostate</font><!-- open: 71, close: 71 --> <!-- MATCHED MATCHED MATCHED -->
is displayed in the who-line) (see <font color='red'>LINK:(</font>tv-who-line-process-var)).
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-tvob-selector</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td><!-- open: 72, close: 71 --><font class="lisp">nil</font><!-- open: 72, close: 72 --> <!-- MATCHED MATCHED MATCHED -->, or a function which is called by <!-- open: 73, close: 72 --><font class="lisp">tvob-setup</font><!-- open: 73, close: 73 --> <!-- MATCHED MATCHED MATCHED --> (see <font color='red'>LINK:(</font>tvob-setup-fun))
when this job is current and a new <!-- open: 74, close: 73 --><font class="lisp">selected-tvob</font><!-- open: 74, close: 74 --> <!-- MATCHED MATCHED MATCHED --> is needed.
The function takes no arguments and doesn't return anything in particular.
It isn't required to do anything, but it normally should call <!-- open: 75, close: 74 --><font class="lisp">tvob-select</font><!-- open: 75, close: 75 --> <!-- MATCHED MATCHED MATCHED -->
with an appropriate TVOB.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-forced-input</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>If non-<!-- open: 76, close: 75 --><font class="lisp">nil</font><!-- open: 76, close: 76 --> <!-- MATCHED MATCHED MATCHED -->, a character or a string which is forced input for this job.
This is a character or characters which are pretending to come from the keyboard
but really originated from another process or the mouse.  See the function
<!-- open: 77, close: 76 --><font class="lisp">force-kbd-input</font><!-- open: 77, close: 77 --> <!-- MATCHED MATCHED MATCHED --> (<font color='red'>LINK:(</font>force-kbd-input-fun)).
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> job-forced-input-index</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>Index into <!-- open: 78, close: 77 --><font class="lisp">job-forced-input</font><!-- open: 78, close: 78 --> <!-- MATCHED MATCHED MATCHED --> when it is a string.
</td></tr><!-- item_ --></table><!-- end table -->


	At any time, the user of the Lisp Machine may be conducting several
different activities.  For example, he may want to temporarily stop editing
in order to send some mail; he might want to start up a file transfer, and
while waiting for it to finish, continue editing.

	Each such activity, in general, will want some processes to do
computation, and some pieces of the screen (TVOBs) on which to do output.
When the user is not concerned with some activity, he may want its
processes to stop, and/or its TVOBs to stop displaying.  In order to
make it easy to deactivate a set of processes and TVOBs, such a set
may beed together as a <!-- open: 79, close: 78 --><font class="italic">job</font><!-- open: 79, close: 79 --> <!-- MATCHED MATCHED MATCHED -->.

	Every job has a set of processes and TVOBs; these sets are
represented by the lists in the <!-- open: 80, close: 79 --><font class="lisp">job-processes</font><!-- open: 80, close: 80 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 81, close: 80 --><font class="lisp">job-tvobs</font><!-- open: 81, close: 81 --> <!-- MATCHED MATCHED MATCHED --> 
of the job.  Of each set, there is a subset that is <!-- open: 82, close: 81 --><font class="italic">enabled</font><!-- open: 82, close: 82 --> <!-- MATCHED MATCHED MATCHED -->;
these are the <!-- open: 83, close: 82 --><font class="lisp">job-enabled-processes</font><!-- open: 83, close: 83 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 84, close: 83 --><font class="lisp">job-enabled-tvobs</font><!-- open: 84, close: 84 --> <!-- MATCHED MATCHED MATCHED -->
of the job.  A process's being <!-- open: 85, close: 84 --><font class="italic">enabled</font><!-- open: 85, close: 85 --> <!-- MATCHED MATCHED MATCHED --> means that whenever
the job is told that it may run, that process
will be made <!-- open: 86, close: 85 --><font class="italic">active</font><!-- open: 86, close: 86 --> <!-- MATCHED MATCHED MATCHED -->.  The same is true for TVOBs.
When the job is told that it may run its enabled processes, it is
said to be <!-- open: 87, close: 86 --><font class="italic">process-enabled</font><!-- open: 87, close: 87 --> <!-- MATCHED MATCHED MATCHED -->; when it is told that it may
display its enabled TVOBs, it is said to be <!-- open: 88, close: 87 --><font class="italic">tvob-enabled</font><!-- open: 88, close: 88 --> <!-- MATCHED MATCHED MATCHED -->.
A job can control which of its processes and TVOBs are enabled
by means of the functions <!-- open: 89, close: 88 --><font class="lisp">process-enable</font><!-- open: 89, close: 89 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 90, close: 89 --><font class="lisp">process-disable</font><!-- open: 90, close: 90 --> <!-- MATCHED MATCHED MATCHED -->,
<!-- open: 91, close: 90 --><font class="lisp">tvob-enable</font><!-- open: 91, close: 91 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 92, close: 91 --><font class="lisp">tvob-disable</font><!-- open: 92, close: 92 --> <!-- MATCHED MATCHED MATCHED -->, which are described below.

	At any time there is one job which is said to "own the keyboard";
this job is the value of the variable <!-- open: 93, close: 92 --><font class="lisp">kbd-job</font><!-- open: 93, close: 93 --> <!-- MATCHED MATCHED MATCHED -->.  When a function calls
any of the keyboard input functions (such as <!-- open: 94, close: 93 --><font class="lisp">kbd-tyi</font><!-- open: 94, close: 94 --> <!-- MATCHED MATCHED MATCHED -->), the function
will wait until the current job is the <!-- open: 95, close: 94 --><font class="lisp">kbd-job</font><!-- open: 95, close: 95 --> <!-- MATCHED MATCHED MATCHED --> before returning.
The reason for this is that while the TV can be split up into areas
so that several programs can type on it at once, there is no similar
way to split up the keyboard; if several jobs want keyboard input,
one of them will get what the user types, and the rest will wait
until they become the <!-- open: 96, close: 95 --><font class="lisp">kbd-job</font><!-- open: 96, close: 96 --> <!-- MATCHED MATCHED MATCHED -->.

	When Lisp is initialized, one job is created and given the keyboard.
The job is given a single, active TVOB, the size of the screen, and
a single, active process.  It is both process-enabled and TVOB-enabled,
so the process and TVOB are both active.

<div class='section' id='30.4'>30.4 Introduction to the Concepts of This Chapter</div>
	It should be made easy for the user to control which jobs
are process-enabled and which are TVOB-enabled.
Unfortunately, the commands to allow easy control
of these parameters have not yet been fully developed.  This section
describes what has been implemented so far, but this will probably change.

	The following two simple functions control whether
a job is process-enabled or TVOB-enabled.

<div class='defun' id='job-set-process-state'>
  <font class='exdent'>
    <font class='funcname'>job-set-process-state </font>
    <font class='italic' color='purple'>job state</font>
  </font><br>
If <!-- open: 97, close: 96 --><font class="italic">state</font><!-- open: 97, close: 97 --> <!-- MATCHED MATCHED MATCHED --> is non-<!-- open: 98, close: 97 --><font class="lisp">nil</font><!-- open: 98, close: 98 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 99, close: 98 --><font class="italic">job</font><!-- open: 99, close: 99 --> <!-- MATCHED MATCHED MATCHED --> is made process-enabled;
otherwise, it is made process-disabled.
</div>

<div class='defun' id='job-set-tvob-state'>
  <font class='exdent'>
    <font class='funcname'>job-set-tvob-state </font>
    <font class='italic' color='purple'>job state</font>
  </font><br>
If <!-- open: 100, close: 99 --><font class="italic">state</font><!-- open: 100, close: 100 --> <!-- MATCHED MATCHED MATCHED --> is non-<!-- open: 101, close: 100 --><font class="lisp">nil</font><!-- open: 101, close: 101 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 102, close: 101 --><font class="italic">job</font><!-- open: 102, close: 102 --> <!-- MATCHED MATCHED MATCHED --> is made TVOB-enabled;
otherwise, it is made TVOB-disabled.  Since this function can change
the set of active TVOBs, the caller should follow with a call to
<!-- open: 103, close: 102 --><font class="lisp">tvob-setup</font><!-- open: 103, close: 103 --> <!-- MATCHED MATCHED MATCHED --> (see <font color='red'>LINK:(</font>tvob-setup-fun)).
</div>

	There is one job designated as the top-level job, from
which other jobs are selected.  This job is the value of the variable
<!-- open: 104, close: 103 --><font class="lisp">si:top-job</font><!-- open: 104, close: 104 --> <!-- MATCHED MATCHED MATCHED -->.  When Lisp is initialized, <!-- open: 105, close: 104 --><font class="lisp">si:top-job</font><!-- open: 105, close: 105 --> <!-- MATCHED MATCHED MATCHED --> is set
to the initial job, and usually it is never set again.  If this job
wants to let some other job run, it uses the function <!-- open: 106, close: 105 --><font class="lisp">job-select</font><!-- open: 106, close: 106 --> <!-- MATCHED MATCHED MATCHED -->,
which may be called directly by the user, or by a program's "command interface"
function.  (The functions <!-- open: 107, close: 106 --><font class="lisp">ed</font><!-- open: 107, close: 107 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 108, close: 107 --><font class="lisp">edval</font><!-- open: 108, close: 108 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 109, close: 108 --><font class="lisp">edprop</font><!-- open: 109, close: 109 --> <!-- MATCHED MATCHED MATCHED --> serve
this purpose for Eine, and the function <!-- open: 110, close: 109 --><font class="lisp">supdup</font><!-- open: 110, close: 110 --> <!-- MATCHED MATCHED MATCHED --> for the Supdup program.)

<div class='defun' id='job-select'>
  <font class='exdent'>
    <font class='funcname'>job-select </font>
    <font class='italic' color='purple'>job</font>
  </font><br>
<!-- open: 111, close: 110 --><font class="lisp">job-select</font><!-- open: 111, close: 111 --> <!-- MATCHED MATCHED MATCHED --> should be called from the top-level job to give the
keyboard to <!-- open: 112, close: 111 --><font class="italic">job</font><!-- open: 112, close: 112 --> <!-- MATCHED MATCHED MATCHED -->.  The top-level job is made process-disabled
and TVOB-disabled, and <!-- open: 113, close: 112 --><font class="italic">job</font><!-- open: 113, close: 113 --> <!-- MATCHED MATCHED MATCHED --> is made process-enabled and TVOB-enabled,
and is given the keyboard (made to be the <!-- open: 114, close: 113 --><font class="lisp">kbd-job</font><!-- open: 114, close: 114 --> <!-- MATCHED MATCHED MATCHED -->).
</div>

	When the keyboard belongs to some job other than the top-level job,
'setq call-key page
the "CALL" key is interpreted specially to mean "Return the keyboard to the
top-level job."  If the user types a "CALL", the current <!-- open: 115, close: 114 --><font class="lisp">kbd-job</font><!-- open: 115, close: 115 --> <!-- MATCHED MATCHED MATCHED --> will
be made process-disabled and TVOB-disabled, the top-level job will be made
process-enabled and TVOB-enabled, and the top-level job will be given the
keyboard. The Control and Meta keys can be used with CALL:
Control prevents the current <!-- open: 116, close: 115 --><font class="lisp">kbd-job</font><!-- open: 116, close: 116 --> <!-- MATCHED MATCHED MATCHED --> from being made TVOB-disabled,
and Meta stops it from being process-disabled.

<div class='section' id='30.5'>30.5 Introduction to the Concepts of This Chapter</div>
	The following four functions are all used to create TVOBs; they
differ primarily in the way the caller specifies the TVOB's area of the screen.
To fully specify the area, use <!-- open: 117, close: 116 --><font class="lisp">tvob-create-absolute</font><!-- open: 117, close: 117 --> <!-- MATCHED MATCHED MATCHED -->.
If you just want an area of a certain size, but don't care where the area
is, use <!-- open: 118, close: 117 --><font class="lisp">tvob-create</font><!-- open: 118, close: 118 --> <!-- MATCHED MATCHED MATCHED -->.
If you need at least a certain size but would accept a larger size
if the space is available, use <!-- open: 119, close: 118 --><font class="lisp">tvob-create-expandable</font><!-- open: 119, close: 119 --> <!-- MATCHED MATCHED MATCHED -->.
If you have a pc ppr (piece of paper) and want to make a TVOB
for it, use <!-- open: 120, close: 119 --><font class="lisp">tvob-create-for-pc-ppr</font><!-- open: 120, close: 120 --> <!-- MATCHED MATCHED MATCHED -->.

<div class='defun' id='tvob-create-absolute'>
  <font class='exdent'>
    <font class='funcname'>tvob-create-absolute </font>
    <font class='italic' color='purple'>x1 y1 x2 y2 &rest options</font>
  </font><br>
<!-- open: 121, close: 120 --><font class="lisp">tvob-create-absolute</font><!-- open: 121, close: 121 --> <!-- MATCHED MATCHED MATCHED --> creates and returns a new TVOB.
Its fields are set up as follows:
<table>
<tr valign='top'>
<td><font class='lisp'> tvob-handler</font></td><td>The value of the <!-- open: 122, close: 121 --><font class="lisp">:handler</font><!-- open: 122, close: 122 --> <!-- MATCHED MATCHED MATCHED --> option.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-info</font></td><td>The value of the <!-- open: 123, close: 122 --><font class="lisp">:info</font><!-- open: 123, close: 123 --> <!-- MATCHED MATCHED MATCHED --> option.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-job</font></td><td>The value of the <!-- open: 124, close: 123 --><font class="lisp">:job</font><!-- open: 124, close: 124 --> <!-- MATCHED MATCHED MATCHED --> option.  If it is <!-- open: 125, close: 124 --><font class="lisp">t</font><!-- open: 125, close: 125 --> <!-- MATCHED MATCHED MATCHED -->, the current job is used instead;
this is the default.
Otherwise it should be <!-- open: 126, close: 125 --><font class="lisp">nil</font><!-- open: 126, close: 126 --> <!-- MATCHED MATCHED MATCHED --> (meaning that the TVOB
is not associated with any job), or a job.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-priority</font></td><td>The value of the <!-- open: 127, close: 126 --><font class="lisp">:priority</font><!-- open: 127, close: 127 --> <!-- MATCHED MATCHED MATCHED --> option.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-x1</font></td><td><!-- open: 128, close: 127 --><font class="italic">x1</font><!-- open: 128, close: 128 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-y1</font></td><td><!-- open: 129, close: 128 --><font class="italic">y1</font><!-- open: 129, close: 129 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-x2</font></td><td><!-- open: 130, close: 129 --><font class="italic">x2</font><!-- open: 130, close: 130 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-y2</font></td><td><!-- open: 131, close: 130 --><font class="italic">y2</font><!-- open: 131, close: 131 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-screen</font></td><td>The value of the <!-- open: 132, close: 131 --><font class="lisp">:screen</font><!-- open: 132, close: 132 --> <!-- MATCHED MATCHED MATCHED --> option, which should be a screen.  It defaults
to the value of <!-- open: 133, close: 132 --><font class="lisp">tv-default-screen</font><!-- open: 133, close: 133 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> tvob-status</font></td><td>The value of the <!-- open: 134, close: 133 --><font class="lisp">:status</font><!-- open: 134, close: 134 --> <!-- MATCHED MATCHED MATCHED --> option.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> tvob-clobbered-p</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td><!-- open: 135, close: 134 --><font class="lisp">nil</font><!-- open: 135, close: 135 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr>
<tr valign='top'><td colspan='2'><font class='lisp'> tvob-mouse-handler</font></td><td><!-- empty --></td></tr>
<tr><td><!-- empty title --></td><td>The value of the <!-- open: 136, close: 135 --><font class="lisp">:mouse-handler</font><!-- open: 136, close: 136 --> <!-- MATCHED MATCHED MATCHED --> option.  If the value is <!-- open: 137, close: 136 --><font class="lisp">t</font><!-- open: 137, close: 137 --> <!-- MATCHED MATCHED MATCHED -->,
use the default mouse handler.
</td></tr><!-- item_ --></table><!-- end table -->


The options to <!-- open: 138, close: 137 --><font class="lisp">tvob-create-absolute</font><!-- open: 138, close: 138 --> <!-- MATCHED MATCHED MATCHED --> are:
<table>
<tr valign='top'>
<td><font class='lisp'> :handler</font></td><td>The <!-- open: 139, close: 138 --><font class="lisp">tvob-handler</font><!-- open: 139, close: 139 --> <!-- MATCHED MATCHED MATCHED --> function.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :info</font></td><td>The value to go in the <!-- open: 140, close: 139 --><font class="lisp">tvob-info</font><!-- open: 140, close: 140 --> <!-- MATCHED MATCHED MATCHED --> field.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :job</font></td><td>The job with which the TVOB will be associated.  <!-- open: 141, close: 140 --><font class="lisp">t</font><!-- open: 141, close: 141 --> <!-- MATCHED MATCHED MATCHED --> means the current
job and <!-- open: 142, close: 141 --><font class="lisp">nil</font><!-- open: 142, close: 142 --> <!-- MATCHED MATCHED MATCHED --> means no job.  The default is the current job.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :mouse-handler</font></td><td>The <!-- open: 143, close: 142 --><font class="lisp">tvob-mouse-handler</font><!-- open: 143, close: 143 --> <!-- MATCHED MATCHED MATCHED --> function.  <!-- open: 144, close: 143 --><font class="lisp">nil</font><!-- open: 144, close: 144 --> <!-- MATCHED MATCHED MATCHED --> means this TVOB doesn't
do anything special with the mouse, and <!-- open: 145, close: 144 --><font class="lisp">t</font><!-- open: 145, close: 145 --> <!-- MATCHED MATCHED MATCHED --> means the <!-- open: 146, close: 145 --><font class="lisp">mouse-default-handler</font><!-- open: 146, close: 146 --> <!-- MATCHED MATCHED MATCHED -->
should be used.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :name</font></td><td>The print-name of the TVOB.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :priority</font></td><td><!-- open: 147, close: 146 --><font class="lisp">t</font><!-- open: 147, close: 147 --> <!-- MATCHED MATCHED MATCHED --> to make this TVOB more tenacious of its place on the screen.
</td></tr>
<tr valign='top'>
<td><font class='lisp'> :screen</font></td><td>The screen on which the TVOB will appear.  The default is <!-- open: 148, close: 147 --><font class="lisp">tv-default-screen</font><!-- open: 148, close: 148 --> <!-- MATCHED MATCHED MATCHED -->.
</td></tr><!-- item_ --></table><!-- end table -->

</div>

<div class='defun' id='tvob-create'>
  <font class='exdent'>
    <font class='funcname'>tvob-create </font>
    <font class='italic' color='purple'>x y &rest options</font>
  </font><br>
This allocates an area of the screen of width <!-- open: 149, close: 148 --><font class="italic">x</font><!-- open: 149, close: 149 --> <!-- MATCHED MATCHED MATCHED --> and height <!-- open: 150, close: 149 --><font class="italic">y</font><!-- open: 150, close: 150 --> <!-- MATCHED MATCHED MATCHED -->, and
creates and returns a TVOB with that area.
The options are the same as for <!-- open: 151, close: 150 --><font class="lisp">tvob-create-absolute</font><!-- open: 151, close: 151 --> <!-- MATCHED MATCHED MATCHED -->.
The screen area of the TVOB will be within the rectangular boundaries described
by the <!-- open: 152, close: 151 --><font class="lisp">screen-x1</font><!-- open: 152, close: 152 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 153, close: 152 --><font class="lisp">screen-y1</font><!-- open: 153, close: 153 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 154, close: 153 --><font class="lisp">screen-x2</font><!-- open: 154, close: 154 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 155, close: 154 --><font class="lisp">screen-y2</font><!-- open: 155, close: 155 --> <!-- MATCHED MATCHED MATCHED -->
of the screen on which the TVOB is created.
<!-- open: 156, close: 155 --><font class="lisp">tvob-create</font><!-- open: 156, close: 156 --> <!-- MATCHED MATCHED MATCHED --> tries to choose an area that will overlap
the fewest interesting TVOBs.  Specifically, it tries to stay out of the area used by
the exposed TVOB of the highest priority, then that of the exposed TVOB of the second-highest
priority, etc.  The way priority works is that the exposed tvobs are divided into
twos: those with <!-- open: 157, close: 156 --><font class="lisp">tvob-priority</font><!-- open: 157, close: 157 --> <!-- MATCHED MATCHED MATCHED --> of <!-- open: 158, close: 157 --><font class="lisp">t</font><!-- open: 158, close: 158 --> <!-- MATCHED MATCHED MATCHED -->, and those with <!-- open: 159, close: 158 --><font class="lisp">tvob-priority</font><!-- open: 159, close: 159 --> <!-- MATCHED MATCHED MATCHED -->
of <!-- open: 160, close: 159 --><font class="lisp">nil</font><!-- open: 160, close: 160 --> <!-- MATCHED MATCHED MATCHED -->; the former all have higher priority than the latter.  Within
these twos, the TVOBs are ordered by their ordering in the list <!-- open: 161, close: 160 --><font class="lisp">active-tvobs</font><!-- open: 161, close: 161 --> <!-- MATCHED MATCHED MATCHED -->.
The priority is remembered by the ordering of the list <!-- open: 162, close: 161 --><font class="lisp">exposed-tvobs</font><!-- open: 162, close: 162 --> <!-- MATCHED MATCHED MATCHED -->, of which
the first element is the TVOB of <!-- open: 163, close: 162 --><font class="italic">lowest</font><!-- open: 163, close: 163 --> <!-- MATCHED MATCHED MATCHED --> priority, and the last is the TVOB
of <!-- open: 164, close: 163 --><font class="italic">highest</font><!-- open: 164, close: 164 --> <!-- MATCHED MATCHED MATCHED --> priority.
</div>

<div class='defun' id='tvob-create-expandable'>
  <font class='exdent'>
    <font class='funcname'>tvob-create-expandable </font>
    <font class='italic' color='purple'>min-x min-y &optional max-x max-y &rest options</font>
  </font><br>
This first finds a <!-- open: 165, close: 164 --><font class="italic">min-x</font><!-- open: 165, close: 165 --> <!-- MATCHED MATCHED MATCHED --> by <!-- open: 166, close: 165 --><font class="italic">min-y</font><!-- open: 166, close: 166 --> <!-- MATCHED MATCHED MATCHED --> area of the screen, the same way
<!-- open: 167, close: 166 --><font class="lisp">tvob-create</font><!-- open: 167, close: 167 --> <!-- MATCHED MATCHED MATCHED --> does.  Then it tries to make that area larger,
up to <!-- open: 168, close: 167 --><font class="italic">max-x</font><!-- open: 168, close: 168 --> <!-- MATCHED MATCHED MATCHED --> by <!-- open: 169, close: 168 --><font class="italic">max-y</font><!-- open: 169, close: 169 --> <!-- MATCHED MATCHED MATCHED -->, without overlapping any other exposed TVOBs.
Otherwise it is like <!-- open: 170, close: 169 --><font class="lisp">tvob-create</font><!-- open: 170, close: 170 --> <!-- MATCHED MATCHED MATCHED -->.  <!-- open: 171, close: 170 --><font class="italic">max-x</font><!-- open: 171, close: 171 --> <!-- MATCHED MATCHED MATCHED --> defaults to the size
of the area in which automatic allocation takes place: the difference between
the <!-- open: 172, close: 171 --><font class="lisp">screen-x2</font><!-- open: 172, close: 172 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 173, close: 172 --><font class="lisp">screen-x1</font><!-- open: 173, close: 173 --> <!-- MATCHED MATCHED MATCHED --> of the screen.  <!-- open: 174, close: 173 --><font class="italic">max-y</font><!-- open: 174, close: 174 --> <!-- MATCHED MATCHED MATCHED --> defaults similarly.
</div>

<div class='defun' id='tvob-create-for-pc-ppr'>
  <font class='exdent'>
    <font class='funcname'>tvob-create-for-pc-ppr </font>
    <font class='italic' color='purple'>pc-ppr &rest options</font>
  </font><br>
If you want to use a pc ppr, you need an associated TVOB in order
to get permission for your pc ppr to use the screen.
This function takes a pc ppr and creates a TVOB, whose area of the
screen is that of the pc ppr.  The <!-- open: 175, close: 174 --><font class="lisp">tvob-info</font><!-- open: 175, close: 175 --> <!-- MATCHED MATCHED MATCHED --> will be the pc ppr,
the <!-- open: 176, close: 175 --><font class="lisp">tvob-handler</font><!-- open: 176, close: 176 --> <!-- MATCHED MATCHED MATCHED --> a function called <!-- open: 177, close: 176 --><font class="lisp">si:pc-ppr-tvob-handler</font><!-- open: 177, close: 177 --> <!-- MATCHED MATCHED MATCHED -->
(which does the right thing for pieces of paper which don't remember what they are
displaying and hence cannot <!-- open: 178, close: 177 --><font class="lisp">:update</font><!-- open: 178, close: 178 --> <!-- MATCHED MATCHED MATCHED -->),
and the screen used will be the <!-- open: 179, close: 178 --><font class="lisp">pc-ppr-screen</font><!-- open: 179, close: 179 --> <!-- MATCHED MATCHED MATCHED --> of the pc ppr.
If you give the <!-- open: 180, close: 179 --><font class="lisp">:handler</font><!-- open: 180, close: 180 --> <!-- MATCHED MATCHED MATCHED --> option, though, it will override
the <!-- open: 181, close: 180 --><font class="lisp">si:pc-ppr-tvob-handler</font><!-- open: 181, close: 181 --> <!-- MATCHED MATCHED MATCHED -->.  The rest of the options are the same
as in <!-- open: 182, close: 181 --><font class="lisp">tvob-create-absolute</font><!-- open: 182, close: 182 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defun' id='tvob-kill'>
  <font class='exdent'>
    <font class='funcname'>tvob-kill </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
This deactivates <!-- open: 183, close: 182 --><font class="italic">tvob</font><!-- open: 183, close: 183 --> <!-- MATCHED MATCHED MATCHED --> if it is active, and dissociates it from
its associated job (if any).
</div>

<div class='defun' id='tvob-enable'>
  <font class='exdent'>
    <font class='funcname'>tvob-enable </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
Enable <!-- open: 184, close: 183 --><font class="italic">tvob</font><!-- open: 184, close: 184 --> <!-- MATCHED MATCHED MATCHED -->.  If <!-- open: 185, close: 184 --><font class="italic">tvob</font><!-- open: 185, close: 185 --> <!-- MATCHED MATCHED MATCHED --> has no associated job, or if its
job is tvob-enabled, activate <!-- open: 186, close: 185 --><font class="italic">tvob</font><!-- open: 186, close: 186 --> <!-- MATCHED MATCHED MATCHED -->.  After making some calls
to <!-- open: 187, close: 186 --><font class="lisp">tvob-enable</font><!-- open: 187, close: 187 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 188, close: 187 --><font class="lisp">tvob-disable</font><!-- open: 188, close: 188 --> <!-- MATCHED MATCHED MATCHED -->, the caller should call
<!-- open: 189, close: 188 --><font class="lisp">tvob-setup</font><!-- open: 189, close: 189 --> <!-- MATCHED MATCHED MATCHED --> (see <font color='red'>LINK:(</font>tvob-setup-fun)).
</div>

<div class='defun' id='tvob-disable'>
  <font class='exdent'>
    <font class='funcname'>tvob-disable </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
Disable <!-- open: 190, close: 189 --><font class="italic">tvob</font><!-- open: 190, close: 190 --> <!-- MATCHED MATCHED MATCHED -->.  If it was active, deactivate it.  After making some calls
to <!-- open: 191, close: 190 --><font class="lisp">tvob-enable</font><!-- open: 191, close: 191 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 192, close: 191 --><font class="lisp">tvob-disable</font><!-- open: 192, close: 192 --> <!-- MATCHED MATCHED MATCHED -->, the caller should call
<!-- open: 193, close: 192 --><font class="lisp">tvob-setup</font><!-- open: 193, close: 193 --> <!-- MATCHED MATCHED MATCHED --> (see <font color='red'>LINK:(</font>tvob-setup-fun)).
</div>

<div class='defun' id='tvob-setup'>
  <font class='exdent'>
    <font class='funcname'>tvob-setup </font>
    <font class='italic' color='purple'>no-reselection &rest tvobs</font>
  </font><br>
This is the function in charge of keeping the state of the screen and
the internal database consistent when tvobs are activated, deactivated,
moved, etc.  After a program makes some calls to <!-- open: 194, close: 193 --><font class="lisp">tvob-enable</font><!-- open: 194, close: 194 --> <!-- MATCHED MATCHED MATCHED --> and
<!-- open: 195, close: 194 --><font class="lisp">tvob-disable</font><!-- open: 195, close: 195 --> <!-- MATCHED MATCHED MATCHED -->, it may have changed the set of <!-- open: 196, close: 195 --><font class="italic">active</font><!-- open: 196, close: 196 --> <!-- MATCHED MATCHED MATCHED --> TVOBs, and
it should call <!-- open: 197, close: 196 --><font class="lisp">tvob-setup</font><!-- open: 197, close: 197 --> <!-- MATCHED MATCHED MATCHED --> to make sure that the set of <!-- open: 198, close: 197 --><font class="italic">exposed</font><!-- open: 198, close: 198 --> <!-- MATCHED MATCHED MATCHED -->
TVOBs is recomputed, and that the right messages are sent to all TVOBs.
(If <!-- open: 199, close: 198 --><font class="lisp">tvob-enable</font><!-- open: 199, close: 199 --> <!-- MATCHED MATCHED MATCHED --> etc. did that themselves, then unneccesary
redisplay and computation would be unavoidable.) The
<!-- open: 200, close: 199 --><font class="lisp">job-set-tvob-state</font><!-- open: 200, close: 200 --> <!-- MATCHED MATCHED MATCHED --> function can also change the set of active
TVOBs, and it too should be followed by a call to <!-- open: 201, close: 200 --><font class="lisp">tvob-setup</font><!-- open: 201, close: 201 --> <!-- MATCHED MATCHED MATCHED -->.

<!-- open: 202, close: 201 --><font class="lisp">tvob-setup</font><!-- open: 202, close: 202 --> <!-- MATCHED MATCHED MATCHED --> looks at its argument, <!-- open: 203, close: 202 --><font class="italic">tvobs</font><!-- open: 203, close: 203 --> <!-- MATCHED MATCHED MATCHED -->, and at the list of
active TVOBs and figures out which TVOBs should be exposed.

First, <!-- open: 204, close: 203 --><font class="lisp">tvob-setup</font><!-- open: 204, close: 204 --> <!-- MATCHED MATCHED MATCHED --> examines the elements of <!-- open: 205, close: 204 --><font class="italic">tvobs</font><!-- open: 205, close: 205 --> <!-- MATCHED MATCHED MATCHED -->, all of which
should be active, and rearranges the order of <!-- open: 206, close: 205 --><font class="lisp">active-tvobs</font><!-- open: 206, close: 206 --> <!-- MATCHED MATCHED MATCHED -->.  The
TVOBs in <!-- open: 207, close: 206 --><font class="italic">tvobs</font><!-- open: 207, close: 207 --> <!-- MATCHED MATCHED MATCHED --> are moved to the front of <!-- open: 208, close: 207 --><font class="lisp">active-tvobs</font><!-- open: 208, close: 208 --> <!-- MATCHED MATCHED MATCHED -->, and
placed in the order they were given to <!-- open: 209, close: 208 --><font class="lisp">tvob-setup</font><!-- open: 209, close: 209 --> <!-- MATCHED MATCHED MATCHED -->.  The first TVOB
in <!-- open: 210, close: 209 --><font class="italic">tvobs</font><!-- open: 210, close: 210 --> <!-- MATCHED MATCHED MATCHED --> is guaranteed to be first in <!-- open: 211, close: 210 --><font class="lisp">active-tvobs</font><!-- open: 211, close: 211 --> <!-- MATCHED MATCHED MATCHED -->.  The
remaining active TVOBs are moved to the end of <!-- open: 212, close: 211 --><font class="lisp">active-tvobs</font><!-- open: 212, close: 212 --> <!-- MATCHED MATCHED MATCHED -->.  Their
relative order is not changed.  The <!-- open: 213, close: 212 --><font class="lisp">job-enabled-tvobs</font><!-- open: 213, close: 213 --> <!-- MATCHED MATCHED MATCHED --> lists of the
TVOB's jobs are similarly reordered.

Next, <!-- open: 214, close: 213 --><font class="lisp">tvob-setup</font><!-- open: 214, close: 214 --> <!-- MATCHED MATCHED MATCHED --> figures out the new subset of the active TVOBs
that should be exposed, by walking down the <!-- open: 215, close: 214 --><font class="lisp">active-tvobs</font><!-- open: 215, close: 215 --> <!-- MATCHED MATCHED MATCHED --> list and
taking every TVOB that doesn't overlap with some TVOB already on the
new <!-- open: 216, close: 215 --><font class="lisp">exposed-tvobs</font><!-- open: 216, close: 216 --> <!-- MATCHED MATCHED MATCHED --> list.  Since the new list starts out as <!-- open: 217, close: 216 --><font class="lisp">nil</font><!-- open: 217, close: 217 --> <!-- MATCHED MATCHED MATCHED -->,
the first element of <!-- open: 218, close: 217 --><font class="lisp">active-tvobs</font><!-- open: 218, close: 218 --> <!-- MATCHED MATCHED MATCHED -->, which was the second argument to
<!-- open: 219, close: 218 --><font class="lisp">tvob-setup</font><!-- open: 219, close: 219 --> <!-- MATCHED MATCHED MATCHED -->, will always be exposed.  The exposed list is kept in
reverse priority order, as explained under <!-- open: 220, close: 219 --><font class="lisp">tvob-create</font><!-- open: 220, close: 220 --> <!-- MATCHED MATCHED MATCHED --> (see
<font color='red'>LINK:(</font>tvob-create-fun)).

Having determined the new set of exposed tvobs, <!-- open: 221, close: 220 --><font class="lisp">tvob-setup</font><!-- open: 221, close: 221 --> <!-- MATCHED MATCHED MATCHED --> sends
out <!-- open: 222, close: 221 --><font class="lisp">:deselect</font><!-- open: 222, close: 222 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 223, close: 222 --><font class="lisp">:deexpose</font><!-- open: 223, close: 223 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 224, close: 223 --><font class="lisp">:expose</font><!-- open: 224, close: 224 --> <!-- MATCHED MATCHED MATCHED --> commands as needed.
It only sends <!-- open: 225, close: 224 --><font class="lisp">:deselect</font><!-- open: 225, close: 225 --> <!-- MATCHED MATCHED MATCHED --> if the selected tvob would no longer be exposed;
when it does this, it also sets <!-- open: 226, close: 225 --><font class="lisp">selected-tvob</font><!-- open: 226, close: 226 --> <!-- MATCHED MATCHED MATCHED --> to <!-- open: 227, close: 226 --><font class="lisp">nil</font><!-- open: 227, close: 227 --> <!-- MATCHED MATCHED MATCHED -->. At this point,
<!-- open: 228, close: 227 --><font class="lisp">exposed-tvobs</font><!-- open: 228, close: 228 --> <!-- MATCHED MATCHED MATCHED --> is set to its new value.  <!-- open: 229, close: 228 --><font class="lisp">tvob-select</font><!-- open: 229, close: 229 --> <!-- MATCHED MATCHED MATCHED --> then sends
<!-- open: 230, close: 229 --><font class="lisp">:clobber</font><!-- open: 230, close: 230 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 231, close: 230 --><font class="lisp">:update</font><!-- open: 231, close: 231 --> <!-- MATCHED MATCHED MATCHED --> commands to all of the new exposed TVOBs.

	Finally, if there is no <!-- open: 232, close: 231 --><font class="lisp">selected-tvob</font><!-- open: 232, close: 232 --> <!-- MATCHED MATCHED MATCHED -->, and <!-- open: 233, close: 232 --><font class="italic">no-reselection</font><!-- open: 233, close: 233 --> <!-- MATCHED MATCHED MATCHED -->
is <!-- open: 234, close: 233 --><font class="lisp">nil</font><!-- open: 234, close: 234 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 235, close: 234 --><font class="lisp">tvob-setup</font><!-- open: 235, close: 235 --> <!-- MATCHED MATCHED MATCHED --> tries to choose a new <!-- open: 236, close: 235 --><font class="lisp">selected-tvob</font><!-- open: 236, close: 236 --> <!-- MATCHED MATCHED MATCHED --> by calling
the <!-- open: 237, close: 236 --><font class="lisp">job-tvob-selector</font><!-- open: 237, close: 237 --> <!-- MATCHED MATCHED MATCHED --> function of the <!-- open: 238, close: 237 --><font class="lisp">kbd-job</font><!-- open: 238, close: 238 --> <!-- MATCHED MATCHED MATCHED --> (if there is a <!-- open: 239, close: 238 --><font class="lisp">kbd-job</font><!-- open: 239, close: 239 --> <!-- MATCHED MATCHED MATCHED -->
and it has a <!-- open: 240, close: 239 --><font class="lisp">job-tvob-selector</font><!-- open: 240, close: 240 --> <!-- MATCHED MATCHED MATCHED -->).
</div>

<div class='defun' id='tvob-select'>
  <font class='exdent'>
    <font class='funcname'>tvob-select </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
This makes <!-- open: 241, close: 240 --><font class="italic">tvob</font><!-- open: 241, close: 241 --> <!-- MATCHED MATCHED MATCHED --> be the <!-- open: 242, close: 241 --><font class="lisp">selected-tvob</font><!-- open: 242, close: 242 --> <!-- MATCHED MATCHED MATCHED -->.  It makes sure
that <!-- open: 243, close: 242 --><font class="italic">tvob</font><!-- open: 243, close: 243 --> <!-- MATCHED MATCHED MATCHED -->'s job is TVOB-enabled, and that <!-- open: 244, close: 243 --><font class="italic">tvob</font><!-- open: 244, close: 244 --> <!-- MATCHED MATCHED MATCHED --> is exposed.
Then it deselects the current <!-- open: 245, close: 244 --><font class="lisp">selected-tvob</font><!-- open: 245, close: 245 --> <!-- MATCHED MATCHED MATCHED --> (if any) and selects
<!-- open: 246, close: 245 --><font class="italic">tvob</font><!-- open: 246, close: 246 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defun' id='tvob-update'>
  <font class='exdent'>
    <font class='funcname'>tvob-update </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
If the variable <!-- open: 247, close: 246 --><font class="lisp">tvob-complete-redisplay</font><!-- open: 247, close: 247 --> <!-- MATCHED MATCHED MATCHED --> is non-<!-- open: 248, close: 247 --><font class="lisp">nil</font><!-- open: 248, close: 248 --> <!-- MATCHED MATCHED MATCHED -->, set it to
<!-- open: 249, close: 248 --><font class="lisp">nil</font><!-- open: 249, close: 249 --> <!-- MATCHED MATCHED MATCHED --> and call <!-- open: 250, close: 249 --><font class="lisp">tvob-complete-redisplay</font><!-- open: 250, close: 250 --> <!-- MATCHED MATCHED MATCHED -->.  Otherwise send
an <!-- open: 251, close: 250 --><font class="lisp">:update</font><!-- open: 251, close: 251 --> <!-- MATCHED MATCHED MATCHED --> message to all exposed TVOBs.
</div>

<div class='defvar' id='tvob-complete-redisplay'><font class='exdent'><font class='funcname' id='tvob-complete-redisplay'>tvob-complete-redisplay</font><font class="italic"> Variable</font><br></font><!-- end font_exdent -->Used as a flag by <!-- open: 252, close: 251 --><font class="lisp">tvob-update</font><!-- open: 252, close: 252 --> <!-- MATCHED MATCHED MATCHED --> (see above): if non-<!-- open: 253, close: 252 --><font class="lisp">nil</font><!-- open: 253, close: 253 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 254, close: 253 --><font class="lisp">tvob-update</font><!-- open: 254, close: 254 --> <!-- MATCHED MATCHED MATCHED -->
should do a <!-- open: 255, close: 254 --><font class="lisp">tvob-complete-redisplay</font><!-- open: 255, close: 255 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defun' id='tvob-complete-redisplay'>
  <font class='exdent'>
    <font class='funcname'>tvob-complete-redisplay </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
Clears the screen, outlines the screen area of partially-exposed enabled TVOBs,
and sends <!-- open: 256, close: 255 --><font class="lisp">:clobber</font><!-- open: 256, close: 256 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 257, close: 256 --><font class="lisp">:update</font><!-- open: 257, close: 257 --> <!-- MATCHED MATCHED MATCHED --> to all exposed TVOBs.
</div>

<div class='defun' id='tvob-clean'>
  <font class='exdent'>
    <font class='funcname'>tvob-clean </font>
    <font class='italic' color='purple'>tvob</font>
  </font><br>
This "cleans up" the screen.  It sends a <!-- open: 258, close: 257 --><font class="lisp">:clean</font><!-- open: 258, close: 258 --> <!-- MATCHED MATCHED MATCHED --> message to all exposed TVOBs,
and clears portions of the screen not occupied by exposed TVOBs.
</div>

<div class='defun' id='tvob-command'>
  <font class='exdent'>
    <font class='funcname'>tvob-command </font>
    <font class='italic' color='purple'>command tvob &rest arguments</font>
  </font><br>
Sends <!-- open: 259, close: 258 --><font class="italic">command</font><!-- open: 259, close: 259 --> <!-- MATCHED MATCHED MATCHED --> to <!-- open: 260, close: 259 --><font class="italic">tvob</font><!-- open: 260, close: 260 --> <!-- MATCHED MATCHED MATCHED -->, with the given <!-- open: 261, close: 260 --><font class="italic">arguments</font><!-- open: 261, close: 261 --> <!-- MATCHED MATCHED MATCHED -->.
<!-- open: 262, close: 261 --><font class="italic">command</font><!-- open: 262, close: 262 --> <!-- MATCHED MATCHED MATCHED --> should be one of the symbols mentioned above
(<!-- open: 263, close: 262 --><font class="lisp">:set-edges</font><!-- open: 263, close: 263 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 264, close: 263 --><font class="lisp">:clobber</font><!-- open: 264, close: 264 --> <!-- MATCHED MATCHED MATCHED -->, etc.).  After sending the command,
<!-- open: 265, close: 264 --><font class="lisp">tvob-command</font><!-- open: 265, close: 265 --> <!-- MATCHED MATCHED MATCHED --> updates the <!-- open: 266, close: 265 --><font class="italic">tvob</font><!-- open: 266, close: 266 --> <!-- MATCHED MATCHED MATCHED -->'s <!-- open: 267, close: 266 --><font class="lisp">tvob-status</font><!-- open: 267, close: 267 --> <!-- MATCHED MATCHED MATCHED -->,
<!-- open: 268, close: 267 --><font class="lisp">tvob-clobbered-p</font><!-- open: 268, close: 268 --> <!-- MATCHED MATCHED MATCHED -->, or the screen area (<!-- open: 269, close: 268 --><font class="lisp">tvob-x1</font><!-- open: 269, close: 269 --> <!-- MATCHED MATCHED MATCHED --> et. al.) as
appropriate.

In order to preserve consistency, only the <!-- open: 270, close: 269 --><font class="lisp">tvob-setup</font><!-- open: 270, close: 270 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 271, close: 270 --><font class="lisp">tvob-select</font><!-- open: 271, close: 271 --> <!-- MATCHED MATCHED MATCHED --> functions
should send any of the commands <!-- open: 272, close: 271 --><font class="lisp">:select</font><!-- open: 272, close: 272 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 273, close: 272 --><font class="lisp">:deselect</font><!-- open: 273, close: 273 --> <!-- MATCHED MATCHED MATCHED -->, <!-- open: 274, close: 273 --><font class="lisp">:expose</font><!-- open: 274, close: 274 --> <!-- MATCHED MATCHED MATCHED -->,
and <!-- open: 275, close: 274 --><font class="lisp">:deexpose</font><!-- open: 275, close: 275 --> <!-- MATCHED MATCHED MATCHED -->; you should never send these yourself.
</div>

<div class='defun' id='tvob-under-point'>
  <font class='exdent'>
    <font class='funcname'>tvob-under-point </font>
    <font class='italic' color='purple'>x y &optional screen</font>
  </font><br>
Returns the TVOB under the point (<!-- open: 276, close: 275 --><font class="italic">x</font><!-- open: 276, close: 276 --> <!-- MATCHED MATCHED MATCHED -->,<!-- open: 277, close: 276 --><font class="italic">y</font><!-- open: 277, close: 277 --> <!-- MATCHED MATCHED MATCHED -->) on <!-- open: 278, close: 277 --><font class="italic">screen</font><!-- open: 278, close: 278 --> <!-- MATCHED MATCHED MATCHED -->, or
<!-- open: 279, close: 278 --><font class="lisp">nil</font><!-- open: 279, close: 279 --> <!-- MATCHED MATCHED MATCHED --> if there is none.  If there are several TVOBs at that point,
the "top-most" one, i.e. the one which is actually visible, is
returned.  <!-- open: 280, close: 279 --><font class="italic">screen</font><!-- open: 280, close: 280 --> <!-- MATCHED MATCHED MATCHED --> defaults to <!-- open: 281, close: 280 --><font class="lisp">tv-default-screen</font><!-- open: 281, close: 281 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='section' id='30.6'>30.6 Introduction to the Concepts of This Chapter</div>
<div class='defun' id='job-create'>
  <font class='exdent'>
    <font class='funcname'>job-create </font>
    <font class='italic' color='purple'>name</font>
  </font><br>
Creates and returns a job, whose name is <!-- open: 282, close: 281 --><font class="italic">name</font><!-- open: 282, close: 282 --> <!-- MATCHED MATCHED MATCHED -->.
The job is created with no processes and no TVOBs,
and its initial <!-- open: 283, close: 282 --><font class="lisp">job-process-enabled-p</font><!-- open: 283, close: 283 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 284, close: 283 --><font class="lisp">job-tvob-enabled-p</font><!-- open: 284, close: 284 --> <!-- MATCHED MATCHED MATCHED -->
are both <!-- open: 285, close: 284 --><font class="lisp">nil</font><!-- open: 285, close: 285 --> <!-- MATCHED MATCHED MATCHED -->.  <!-- open: 286, close: 285 --><font class="lisp">job-create</font><!-- open: 286, close: 286 --> <!-- MATCHED MATCHED MATCHED --> also puts the job on <!-- open: 287, close: 286 --><font class="lisp">job-list</font><!-- open: 287, close: 287 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defun' id='job-kill'>
  <font class='exdent'>
    <font class='funcname'>job-kill </font>
    <font class='italic' color='purple'>job</font>
  </font><br>
Deactivates and kills all of <!-- open: 288, close: 287 --><font class="italic">job</font><!-- open: 288, close: 288 --> <!-- MATCHED MATCHED MATCHED -->'s processes and TVOBs,
and removes <!-- open: 289, close: 288 --><font class="italic">job</font><!-- open: 289, close: 289 --> <!-- MATCHED MATCHED MATCHED --> from the <!-- open: 290, close: 289 --><font class="lisp">job-list</font><!-- open: 290, close: 290 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defvar' id='job-list'><font class='exdent'><font class='funcname' id='job-list'>job-list</font><font class="italic"> Variable</font><br></font><!-- end font_exdent -->A list of all jobs.  See <!-- open: 291, close: 290 --><font class="lisp">job-create</font><!-- open: 291, close: 291 --> <!-- MATCHED MATCHED MATCHED --> and <!-- open: 292, close: 291 --><font class="lisp">job-kill</font><!-- open: 292, close: 292 --> <!-- MATCHED MATCHED MATCHED -->.
</div>

<div class='defun' id='job-reset-processes'>
  <font class='exdent'>
    <font class='funcname'>job-reset-processes </font>
    <font class='italic' color='purple'>job</font>
  </font><br>
Disables all of <!-- open: 293, close: 292 --><font class="italic">job</font><!-- open: 293, close: 293 --> <!-- MATCHED MATCHED MATCHED -->'s enabled processes, and unwinds those
processes's stacks.
</div>

<div class='defun' id='job-select'>
  <font class='exdent'>
    <font class='funcname'>job-select </font>
    <font class='italic' color='purple'>job</font>
  </font><br>
This is meant to be called from the top-level job, which should have
the keyboard at the time.
It disables the <!-- open: 294, close: 293 --><font class="lisp">kbd-job</font><!-- open: 294, close: 294 --> <!-- MATCHED MATCHED MATCHED -->'s processes and TVOBs,
enables those of <!-- open: 295, close: 294 --><font class="italic">job</font><!-- open: 295, close: 295 --> <!-- MATCHED MATCHED MATCHED -->, and gives <!-- open: 296, close: 295 --><font class="italic">job</font><!-- open: 296, close: 296 --> <!-- MATCHED MATCHED MATCHED --> the keyboard.
</div>

<div class='defun' id='job-return'>
  <font class='exdent'>
    <font class='funcname'>job-return </font>
    <font class='italic' color='purple'>job</font>
  </font><br>
This is meant to be called from jobs other than the top-level job.
It disables the current job's processes and TVOBs,
enables those of the top-level job, and gives the top-level job
the keyboard.
[The job calling it had better have the keyboard.]
</div>
<!-- eof -->
</body>
</html>

